package 算法练习;

import java.util.Scanner;

/** 

* @author ：soulstones
* @version ：2019年8月15日 下午5:45:50 
* @Description：
* 有两个长度为n的排列Ah和B,每个排列由【1，n】数组成，且里面的数都是不同的
* 现在要找一个新的序列c,要求这个新序列中任意两个位置（i，j）
* 满足在A中c[i]要在c[j]的后面，在B中c[i]要在c[j]前面，求c的最长长度
* 
* 第一个一个整数，表示N
* 第二行N个整数，表示A
* 第三行N个整数，表示B
* 满足N《=50000
* 
* 5
* 1 2 4 3 5
* 5 2 3 4 1
* 
* 2

*/
public class 最长子序列 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int[] a = new int[N];
		int[] b = new int[N];
		for (int i = 0; i < N; i++) {
			a[i] = sc.nextInt();
		}
		for (int j = 0; j < N; j++) {
			b[j] = sc.nextInt();
		}
		System.out.println(maxLen(a, b));
		sc.close();
	}
	
	public static int maxLen(int a [] ,int b[]) {
		String s1 = String.valueOf(a);
		String s2 = String.valueOf(b);
		s2 = new StringBuilder(s2).reverse().toString();
		
		int lcs=lcs(s1,s2);
		return lcs;
	}
	
	private static int lcs(String s1, String s2) {
		int m = s1.length();
		int n = s2.length();
		int[][] dp = new int[m + 1][n + 1];
		for (int i = 0; i <= m; i++) {
			dp[i][0] = 0;
		}
		for (int i = 0; i <= n; i++) {
			dp[0][i] = 0;
		}
		for (int i = 1; i <= m; i++) {
			for (int j = 1; j <= n; j++) {
				if (s1.charAt(i - 1) == s2.charAt(j - 1)) {
					dp[i][j] = dp[i - 1][j - 1] + 1;
				} else {
					dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
				}
			}
		}
		return dp[m][n];
	}
}

